﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace EVTEST
{
    public struct EVOBDRealData
    {
        public string ODO;// 里程 km 字符串(保留 1 位小数)
        public string SOC;// 荷点状态 % 字符串(整数)
        public string SOH;//充电状态 % 字符串(整数)
        public string EnhanceSOH;// 增强的充电状态 % 字符串(整数)
        public string DCIR;//充电插座绝缘电阻值(直流) kΩ 字符串(整数)
        public string ACIR;//充电插座绝缘电阻值(交流) kΩ 字符串(整数)
        public string CurrentTotalV;//动力蓄电池系统电压 V 字符串(保留 2 位小数)
        public string CurrentTotalI;// 动力蓄电池系统电流 I 字符串(保留 2 位小数)
        public string ChargingPower;// 储能系统当前充电功率 kw 字符串(保留 2 位小数)
        public string SpeedOfVehicle;// 车速 km/h 字符串(整数)
        public string MotorTA;//驱动电机温度 A(仅支持传) ℃ 字符串(整数)
        public string MotorTB;// 驱动电机温度 B(仅支持传) ℃ 字符串(整数)
        public string MotorTC;// 驱动电机温度 C(仅支持传) ℃ 字符串(整数)
        public string MotorTD;// 驱动电机温度 D(仅支持传) ℃ 字符串(整数)
        public string MotorTE;// 驱动电机温度 E(仅支持传) ℃ 字符串(整数)
        public string MotorTF;// 驱动电机温度 F(仅支持传) ℃ 字符串(整数)
        public string MotorTG;//驱动电机温度 G(仅支持传) ℃ 字符串(整数)
        public string MotorTH;// 驱动电机温度 H(仅支持传) ℃ 字符串(整数)
        public string IGBTA;//IGBT 温度 A(仅支持传) ℃ 字符串(整数)
        public string IGBTB;// IGBT 温度 B(仅支持传) ℃ 字符串(整数)
        public string IGBTC;//IGBT 温度 C(仅支持传) ℃ 字符串(整数)
        public string IGBTD;//IGBT 温度 D(仅支持传) ℃ 字符串(整数)
        public string IGBTE;//IGBT 温度 E(仅支持传) ℃ 字符串(整数)
        public string IGBTF;//IGBT 温度 F(仅支持传) ℃ 字符串(整数)
        public string IGBTG;//IGBT 温度 G(仅支持传) ℃ 字符串(整数)
        public string IGBH;//IGBT 温度 H(仅支持传) ℃ 字符串(整数)
        public double DCDCT ;//DC/DC 变换器温度 ℃ 字符串(整数)
        public string PowerBatteryRealTimeT;// 动力电池实时温度 ℃ 字符串(整数)
        public string AccelerationPedalOpening;// 加速踏板位置 % 字符串(整数)
        public string BreakPedalOpening;// 制动踏板位置 % 字符串(整数)
        public string VoltageRange;//单体电池电压极差 字符串(整数)
        public double MaxVofSingleBattery;// 单体电池电压最高值 V 字符串(保留 3 位小数)
        public string MaxVofSingleBatterySystemNumber;//最高电压电池子系统号字符串(整数)
        public string MaxVofSingleBatteryNumber;// 最高电压电池单体代号 字符串(整数)
        public double MinVofSingleBattery;// 单体电压最低值 V 字符串(保留 3 位小数)
        public string MinVofSingleBatterySystemNumber;//最低电压电池子系统号字符串(整数)
        public string MinVofSingleBatteryNumber;// 最低电压电池单体代号 字符串(整数)
        public double MaxTofSingleBattery;//电池组温度最高值 ℃ 字符串(整数)
        public string MaxTofSingleBatterySystemNumber;//最高温度子系统号字符串(整数)
        public string MaxTofSingleBatteryNumber;// 最高温度探针单体代号 字符串(整数)
        public string MinTofSingleBattery;//电池组温度最低值 ℃ 字符串(整数)
        public string MinTofSingleBatterySystemNumber;//最低温度子系统号字符串(整数)
        public string MinTofSingleBatteryNumber;//最低温度探针单体代号 字符串(整数)
        public string MotorTorque;// 电机转矩 Nm 字符串(整数)
        public string MotorSpeed;//电机转速 rpm 字符串(整数)
        public string MotorBusV;//电机母线电压 V 字符串(保留 2 位小数)
        public string MotorBusI;// 电机母线电流 A 字符串(保留 2 位小数)
        public string BusbarV;// 电机控制器输入电压 V 字符串(保留 2 位小数)
        public string BatteryAlarmInfo;//电池报警信息字符串(0 未报警,1 报警)
        public string MotorAlarmInfo;//电机报警信息字符串(0 未报警,1 报警)
        public string ElectronicControlAlarminfo;//电控报警信息字符串(0 未报警,1 报警)
        public string EngineRunTime;//发动机运行时间 s 字符串(整数)
        public string MILMileage;//故障点亮后的行驶里程 m 字符串(保留 2 位小数)
        public string MILEngineRunTime;// 故障点亮后发动机运行时间 min 字符串(整数)

        //self use
        public double MaxTofMotor;//电机最高温度
        public double MaxTofMCS;//电机控制系统最高温度
    }
    public struct BatteryNumberModel
    {
        public string BatteryNumberA;//动力电蓄电池 A 编号 字符串
        public string BatteryNumberB;// 动力电蓄电池 B 编号 字符串
        public string BatteryNumberC;// 动力电蓄电池 C 编号 字符串
        public string BatteryNumberD;// 动力电蓄电池 D 编号 字符串
        public string BatteryNumberE;// 动力电蓄电池 E 编号 字符串
        public string BatteryNumberF;//动力电蓄电池 F 编号 字符串
        public string BatteryNumberG;// 动力电蓄电池 G 编号 字符串
        public string BatteryNumberH;//动力电蓄电池 H 编号 字符串
    }
    public abstract class EVOBDParent
    {
        public controller.myLED myLED_OBD_connected = null, myLED_OBD_data = null;
        
        
        /// <summary>
        /// 0-等待检测中 1-扫描接口 2-扫描完毕 3-获取车辆信息 4-获取ECU信息 5-获取故障代码 6-获取就绪状态
        /// </summary>
        public int wait_process = 0;
        public bool VCIisConnected = false;
        protected double InvalidDataValue = 0;
        public virtual void setInvalidDataValue(double value)
        {
            InvalidDataValue = value;
        }
        public static double GetDouble(string str, double nullvalue = -99)
        {
            if (!String.IsNullOrEmpty(str))
            {
                double temp = 0;
                if (double.TryParse(str, out temp))
                {
                    return temp;
                }
                else
                    return nullvalue;
            }
            else
            {
                return nullvalue;
            }
        }
        public static int GetInt(string str, int nullvalue = -99)
        {
            if (!String.IsNullOrEmpty(str))
            {
                int temp = 0;
                if (int.TryParse(str, out temp))
                {
                    return temp;
                }
                else
                    return nullvalue;
            }
            else
            {
                return nullvalue;
            }
        }

        #region 实现OBD接口
        /// <summary>
        /// 终止OBD服务，在车辆检测退出事件时调用
        /// </summary>
        /// <returns></returns>
        //public abstract bool closeServer();
        /// <summary>
        /// 开始OBD服务，初始化OBD实例后调用
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        public abstract bool startService(out string msg);
        /// <summary>
        /// 停止OBD服务，无需调用
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        public abstract bool stopService(out string msg);
        public abstract bool getVCIState(out string code, out string msg);
        public abstract bool StartTest(EV_MODEL.CarbjModel model,out string code, out string msg);
        public abstract bool StopTest(out string code, out string msg);

        public virtual bool GetDTCInfo(out int current, out List<string> GZDM,out List<string> GZXX,out string code, out string msg)
        {
            current = 0;
            code = "-1";
            msg = "暂不提供该接口";
            GZDM = new List<string>();
            GZXX = new List<string>();
            return false;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="LampState">0:off 1-on</param>
        /// <param name="code"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public virtual bool GetLampState(out int LampState,out string code, out string msg)
        {
            LampState = 0;
            code = "-1";
            msg = "暂不提供该接口";
            return false;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="model"></param>
        /// <param name="code">0 成功；1 失败；2 保留；3 程序正在处理别的命令；4 未执行开始检测指令</param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public virtual bool GetRTData(out EVOBDRealData model,out string code, out string msg)
        {
            model = new EVOBDRealData();
            code = "-1";
            msg = "暂不提供该接口";
            return false;
        }
        public virtual bool GetBatteryNumber(out BatteryNumberModel model, out string code, out string msg)
        {
            model = new BatteryNumberModel();
            code = "-1";
            msg = "暂不提供该接口";
            return false;
        }
        public virtual bool GetVIN(out string VIN,out string code, out string msg)
        {
            VIN = "";
            code = "-1";
            msg = "暂不提供该接口";
            return false;
        }
        public virtual bool GetECUName(out string ECUName,out string code, out string msg)
        {
            ECUName = "";
            code = "-1";
            msg = "暂不提供该接口";
            return false;
        }
        public virtual bool getVersion(out string versionnumber, out string code, out string msg)
        {
            versionnumber = "";
            code = "-1";
            msg = "暂不提供该接口";
            return false;
        }
        #endregion
    }
}
